package com.csust.automaticteach.utils;


import cn.hutool.json.JSONObject;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class GenericEntityConverter {

    /**
     * 将给定实体类对象的非空属性转换为 JSON 格式
     *
     * @param entity 实体类对象
     * @param <T>    实体类的类型
     * @return 转换后的 JSONObject
     */
    public static <T> JSONObject convertToJson(T entity) {
        if (entity == null) {
            return null;
        }
        JSONObject json = new JSONObject();
        Class<?> clazz = entity.getClass();
        try {
            // 获取所有字段，包括私有字段
            Field[] fields = clazz.getDeclaredFields();

            for (Field field : fields) {
                field.setAccessible(true); // 设置字段可访问

                Object value = field.get(entity); // 获取字段值

                if (value != null) { // 判断字段值是否非空
                    if (value instanceof String) {
                        // 如果是字符串类型，检查是否为空字符串
                        if (!((String) value).isEmpty()) {
                            json.put(field.getName(), value);
                        }
                    } else {
                        // 其他类型直接放入 JSON
                        json.put(field.getName(), value);
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return json;
    }

    public static Map<String, Object> entityToMap(Object entity) {
        Map<String, Object> params = new HashMap<>();
        if (entity == null) {
            return params;
        }
        try {
            // 获取所有字段，包括私有字段
            Field[] fields = entity.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true); // 允许访问私有字段

                Object value = field.get(entity); // 获取字段的值

                // 跳过 null 或空字符串的字段
                if (value == null || (value instanceof String && ((String) value).trim().isEmpty())) {
                    continue;
                }

                // 修复 fileUrl 中的 "https/" typo
                if (field.getName().equals("fileUrl") && value instanceof String) {
                    String fixedValue = ((String) value).replace("https/", "https://");
                    params.put(field.getName(), fixedValue);
                } else {
                    // 正常存入字段名和字段值
                    params.put(field.getName(), value);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return params;
    }

}